
//preloading.....
load("library/common.js");

JEuler.system.loadJS("library/math.js");

(function() {

    //JEuler.system.loadJS("data/???.dat");
    JEuler.system.printCaption("072");
    JEuler.system.startTimerCount();
    
    var limit=1000000;
    
    JEuler.math.PrimeUtils.sievePrime(Math.floor(Math.pow(10,7)/2));
    JEuler.math.PrimeUtils.printCachedPrimes("v");
    var primes = JEuler.math.PrimeUtils.getPrimePool();
    JEuler.system.printTimerCount();
    JEuler.system.startTimerCount();

    function getFactors(n) {
        if(JEuler.math.PrimeUtils.isPrime(n)) return [n];
        var tmp = n, result=[];
        for(var i=0; i<primes.length; i++) {
            var p = primes[i];
            if(tmp<p) return result;
            if(tmp%p==0) result.push(p);
            while(tmp%p==0) {
                tmp = tmp/p
            }
        }
        return result;
    }
    
    function phi(n, factors) {
        var v=n;
        factors = factors || getFactors(n);
        for(var i=0; i<factors.length; i++) {
            v = v - v /factors[i]
        }
        return v;
    }
    
    var sum=0; 
    for(var i=2; i<=limit; i++) {
        if(i%10000==0) print(i);
        sum = sum + phi(i);
        
    }
    JEuler.system.print("SUM=" + sum);

    JEuler.system.printTimerCount();
    
})();
